#ifndef TYPEDEF_H
#define TYPEDEF_H

#define TRUE 1
#define FALSE 0
#define MEMORYSIZE 32000
#define REGISTERSIZE 32

/*##############################################################################
#                                                                              #
# COMMANDS AND SPECIAL PURPOSE REGISTERS                                       #
#                                                                              #
##############################################################################*/
#define LINKREGISTER 31
#define STACKPOINTER 30
#define FRAMEPOINTER 29

// Format 1
#define TRAP 0

#define ADDI 1
#define SUBI 2
#define MULI 3
#define DIVI 4
#define MODI 5
#define CMPI 6

#define LDW  7
#define STW  8

#define POP  9
#define PSH  10

#define BEQ  11
#define BGE  12
#define BGT  13
#define BLE  14
#define BLT  15
#define BNE  16

#define BR   17
#define BSR  18

#define READC  19
#define PRINTC 20
#define READI  21
#define PRINTI 22

// Format 2
#define ADD 23
#define SUB 24
#define MUL 25
#define DIV 26
#define MOD 27
#define CMP 28
#define RET 29

#define FLO 30
#define FLC 31
#define RDC 32
#define WRC 33

// Format 3
#define JSR 34

/*##############################################################################
#                                                                              #
# METHODS AND GLOBAL VARIABLES                                                 #
#                                                                              #
##############################################################################*/
void usageError();
void initialize();
int readExecutableFileToMemory(char *fileName);
void fetchInstruction();
int decodeInstruction(char *op, char *a, char *b, int *c);
void executeInstruction(char *op, char *a, char *b, int *c);
void printStatus();
char *getInstructionString(char op);

int run;
int debug;
long *reg;
unsigned long instructionRegister;
unsigned char *memory;
int programCounter;
long programSize;

#endif // TYPEDEF_H
